LIMITACIONES DE
LA INFORMÁTICA

“Las matemáticas están interesadas en los sistemas infinitos, mientras la informática no” (Donald Knuth)

“Las matemáticas tratan de teoremas y relaciones estáticas, mientras que la Informática trata de algoritmos y relaciones dinámicas” (Donald Knuth)



La Naturaleza de la Informática

La informática o la ciencia de los ordenadores (Computer Science) nació por la convergencia de varias disciplinas: El desarrollo de los ordenadores fue la culminación de varias ideas clave: Pero no podemos olvidar a Ada Lovelace fue la primera persona que escribió un programa de ordenador, tomando como base el diseño funcional de la máquina analítica de Babbage.

Ada avanzó varios conceptos importantes, que se harían realidad años más tarde. Inventó el concepto de máquina universal para realizar computaciones numéricas y procesos simbólicos. Inventó también el concepto de programa o algoritmo, con tres estructuras: subrutinas, bucle y bifurcación condicional. En definitiva, Ada dio el salto conceptual desde la máquina calculadora al ordenador de propósito general. El ordenador, tal y como lo concebimos hoy (un dispositivo universal) fue imaginado por Ada y posteriormente desarrollado por Turing y Von Neumann.

Hay que distinguir entre informática teórica e informática práctica. La informática teórica nació con Boole, Ada Lovelace, Turing y Shannon. La informática práctica nació con von Neumann. Turing y Shannon también actuaron como puentes entre la informática teórica y la práctica.

A pesar de todos estos antecedentes conocidos, se discute sobre la verdadera naturaleza de la informática. Esto es justificable, pues si existen dudas sobre la naturaleza de la matemática, parecería lógico que también existan dudas sobre la naturaleza de la informática, heredera en gran parte de la matemática. Existen diferentes opiniones al respecto, entre ellas las siguientes:
Los Lenguajes de Programación

La crisis del software. La crisis de los lenguajes de programación

En 1968, durante la NATO Software Engineering Conference, se acuñó el término “crisis del software” para indicar que el software era difícil de crear, mantener, planificar, controlar, poco flexible, poco fiable y poco reusable. Han pasado muchos años desde entonces, sin embargo, el problema subsiste, pues no se ha encontrado una solución plenamente satisfactoria.

Un aspecto esencial del desarrollo de aplicaciones informáticas lo constituye el lenguaje de programación, que sigue siendo realmente frustrante, principalmente por el modelo de pensamiento que impone. Realmente hay que hablar de la crisis del lenguaje, más que del software, crisis que no se superará hasta que dispongamos de un lenguaje estándar, universal, potente, flexible, de alto nivel, creativo, fácil de aprender y de usar.

Desde los orígenes de la informática se han inventado muchos lenguajes de programación, y todavía siguen inventándose. Y aunque existen muchas razones para hacerlo, como la aplicación de diferentes puntos de vista, paradigmas, modelos, etc., la razón principal de fondo es la insatisfacción. Todavía no se ha encontrado un lenguaje de programación que se ajuste plenamente, que encaje con nuestro modelo de pensamiento, de tal forma que exista perfecta correspondencia entre nuestros recursos semánticos internos y los conceptos proporcionados por el lenguaje de programación.

Ha habido, a lo largo de la relativamente corta historia de los lenguajes de programación, una serie de hitos que han supuesto avances importantes por la aportación de nuevas ideas que posteriormente han sido adoptadas por otros lenguajes. Entre estos lenguajes están Pascal, Algol 68, Simula 67, Lisp, AWK, Snobol y Prolog. En los últimos años se ha reavivado el interés por el diseño de nuevos lenguajes de programación. Fruto de este interés han sido nuevos lenguajes como CLU, Euclid, Mesa, etc.

Hoy día se siguen inventando nuevos lenguajes de programación de propósito general que intentan superar las limitaciones de los actuales, adoptando nuevos paradigmas o integrando paradigmas ya existentes, con el objeto de proporcionar una mayor generalidad, expresividad y flexibilidad.

Hay muchas alternativas para mejorar esta situación. Una de ellas es, como afirma Terry Winograd [1979], abandonar nuestra visión obsoleta de lo que es la programación y los lenguajes de programación y comenzar otra vez por el principio.

John Backus [1978], en su famosa conferencia del premio Turing, ya sugirió que la “crisis del software” sólo puede superarse mediante un enfoque revolucionario en el diseño de los lenguajes de programación y en la propia tarea de la programación. Aunque Backus abogó por un enfoque funcional, su manifiesto sigue plenamente vigente.

Pero no solo hay lenguajes de programación. Hay toda clase de lenguajes informáticos: de programación, de especificación, de inteligencia artificial, de representación del conocimiento, de gestión de bases de datos, de marcaje, de guionado, etc. El problema principal es que todos estos lenguajes son diferentes y están desconectados entre sí. Lo ideal es que existiera un lenguaje madre o un núcleo conceptual común del que surgieran los diferentes lenguajes particulares.


Multiplicidad de paradigmas de programación

Desde que Thomas S. Kuhn [1977] utilizó la palabra “paradigma” para referirse a una forma de ver el mundo y señalar que la evolución científica se produce, no de forma continua, sino por saltos provocados precisamente por cambios de paradigma, este término se ha impuesto en el área de los lenguajes de programación para indicar los diferentes enfoques o puntos de vista respecto a la concepción del proceso de programación y a la forma de modelar un dominio de problemas.

Desde el principio de la informática, los lenguajes de programación se han intentado reducir a una sola primitiva conceptual. Pero tras el concepto elegido hay otra serie de conceptos auxiliares o de segundo nivel. Por ejemplo, en programación imperativa la primitiva conceptual es la sentencia, pero hay sentencias aritméticas, lógicas, de control, etc.

Los paradigmas de programación que podemos considerar “clásicos”, y sus correspondientes primitivas conceptuales, son:

ParadigmaPrimitiva conceptual
ImperativoSentencia
FuncionalFunción
LógicoRegla
(condición → acción)
RelacionalRelación (tabla)
ObjetualObjeto

Se tenía la esperanza de que el paradigma objetual o paradigma orientado a objetos (POO) fuera el paradigma “definitivo”, la forma más adecuada de concebir la realidad y modelar los problemas. Pero pronto se constató que era un paradigma más, con sus correspondientes limitaciones, y además el más complejo de todos.

Tras los paradigmas clásicos han surgido nuevos paradigmas (también basados en una primitiva conceptual) como la programación orientada a aspectos, a agentes, a eventos, a restricciones, etc. Este proceso tipo “torre de Babel” parece no tener fin, lo que ha provocado una situación más que desconcertante. Cualquiera de estos paradigmas es legítimo, pero ninguno satisface plenamente, pues no son suficientemente genéricos. Los paradigmas son útiles y necesarios, pero el problema reside en que: Hasta ahora no ha aparecido el paradigma “definitivo”, un paradigma universal tal que los demás paradigmas sean casos particulares. Este paradigma universal sería solo posible con un lenguaje formal universal.


Los lenguajes multiparadigma

La mayoría de los lenguajes de programación soportan un sólo paradigma, es decir, una única forma de modelar y contemplar los problemas. Esto implica una restricción sobre otras posibles alternativas y, por lo tanto, un freno al pensamiento creativo, al imponer un modelo mental único. Para superar las restricciones mentales impuestas por los lenguajes monoparadigma han surgido los llamados “lenguajes multiparadigma” [Hailpern, 1986, 1987] [Placer, 1991].

Los lenguajes multiparadigma se justifican porque hay problemas que no se adaptan de manera completa a un sólo paradigma, problemas en los que es adecuado aplicar un cierto paradigma en una parte, y otro paradigma diferente en otra parte. Y porque se necesita más margen de maniobrabilidad y libertad más allá de las limitaciones impuestas por un sólo paradigma.

Existen numerosísimos ejemplos de integración de paradigmas. He aquí algunos: A veces no se integran paradigmas completos, sino sólo algunas características de un cierto paradigma, por ejemplo: Existen las siguientes formas de integración de paradigmas:
  1. Mediante interfases entre diferentes lenguajes monoparadigma.

  2. Extendiendo un lenguaje monoparadigma para que soporte otro u otros paradigmas.

    En general se trataría de la mera acumulación de las características o recursos lingüísticos asociados a los paradigmas componentes.

  3. Creando nuevos lenguajes que soporten varios paradigmas con una estructura lingüística unificada.
Este último camino es el más interesante, pues lo que se pretende es integrar los diferentes paradigmas mediante el uso de una semántica profunda subyacente, extrayendo los mecanismos genéricos presentes en la raíz de todos los paradigmas particulares. Este enfoque es el que más puede ayudar a entender las conexiones entre los diversos paradigmas que hoy se consideran separados y desconectados.

Brent Hailpern [1986] afirma que esta relativamente nueva área de investigación de los lenguajes multiparadigma es "excitante y vital", pero que son necesarios esfuerzos teóricos y prácticos antes de que este área madure y sea bien comprendida.

Con este enfoque también se evita la denominada "impedance mismatch" (desajuste de impedancias), que se refiere al problema de la existencia de diferentes modelos de pensamiento en un lenguaje multiparadigma. Con un enfoque integrador que utilice sólo mecanismos genéricos, tal desajuste no existiría.


Otras limitaciones de los lenguajes de programación

La Semántica de los Lenguajes de Programación

El término “semántica” se usa en lingüística y se refiere al significado asociado a las construcciones sintácticas de un lenguaje. En los lenguajes de programación, la semántica se considera que tiene dos aspectos:
  1. Semántica estática. Es la información generada en tiempo de compilación.

  2. Semántica dinámica. Es la información interpretada en tiempo de ejecución.
La frontera entre ambos tipos de semánticas es, no obstante, algo difusa.

En la teoría de los lenguajes formales, el campo de la sintaxis está bien establecido a través de los diferentes tipos de gramáticas (que son realmente metalenguajes). En cambio, la formalización de la semántica ha sido hasta ahora, un tema mucho más complejo, al que se han propuesto diferentes soluciones, pero sin que exista hasta ahora un modelo estándar, plenamente aceptado, como en el caso de la sintaxis formal.

Como consecuencia de dicha complejidad, la semántica no ha desempeñado hasta ahora el papel central que le debería corresponder (en el diseño, en la implementación y en la utilización), pese a ser el aspecto más importante de un lenguaje de programación. Este papel central se lo ha arrebatado la sintaxis formal, tema que debería ser considerado secundario, pues existen muchas formas sintácticas posibles para representar una misma semántica.

En la definición de un lenguaje de programación, la semántica debería ser lo primero en definirse, y luego la sintaxis. Pero la situación actual es la contraria: se define primero la sintaxis (que es una tarea relativamente fácil) y posteriormente se trata de definir la semántica, casi siempre de una manera “forzada”, acudiendo a algún modelo conceptual que se adapte lo más posible al lenguaje. Como esta adaptación no es fácil ni normalmente tampoco es completa, es frecuente que se acuda (de forma complementaria o sustitutiva) al lenguaje natural, utilizado de manera más o menos literaria o estructurada.

El llamado “gap semántico” es la existencia de una disociación o separación entre los conceptos utilizados en un lenguaje de programación y los conceptos que se utilizan durante el desarrollo de aplicaciones, tanto en el tema de los datos como en el de los procesos.

Ha habido un fundamentalismo sintáctico imperante hasta ahora, es decir, se ha dado una importancia excesiva a la sintaxis, en detrimento de la semántica. Chomsky es el principal “culpable”, pues con su gramática generativa fue el impulsor de la sintaxis formal, sin referencia alguna al significado. Es absolutamente necesario invertir esta situación: lo primero es la semántica (el aspecto profundo de un lenguaje) y luego la sintaxis (el aspecto superficial).

Es necesario hacer explícita la semántica. La semántica está siempre presente en todos los lenguajes formales, pero el problema es que está casi siempre oculta, pues no existe una correspondencia clara y biunívoca entre forma (sintaxis) y fondo (semántica).

Actualmente la semántica está teniendo un creciente interés por la denominada “web semántica”, la nueva generación de la web (una iniciativa del W3C), La web semántica está basada en un espacio flexible y abierto de conceptos y relaciones. El objetivp es superar así las limitaciones de la web actual (basada principalmente en meros enlaces explícitos) e ir en la línea de la emulación de la mente, es decir, una web inteligente en la que se dispondría de funcionalidades avanzadas como: búsqueda semántica, gestión del conocimiento, automatización de procesos de razonamiento y de toma de decisiones, etc.

La web semántica ha provocado la aparición de nuevos lenguajes, con el consiguiente crecimiento adicional de la torre de Babel lingüística. Estos nuevos lenguajes se basan en ontologías, que permiten modelar, describir y representar un dominio. La ontología de un dominio consiste en la selección de un conjunto básico de conceptos y el establecimiento de las relaciones entre ellos.


Los intentos de capturar la semántica de los lenguajes de programación

Ha habido numerosos intentos de capturar la semántica de los lenguajes de programación. Los modelos formales más importantes utilizados hasta el momento han sido los siguientes: Todos estos modelos han sido infructuosos. La razón estriba en que la semántica de un lenguaje es imposible capturarla, porque capturarla es traer la semántica a la superficie, y ahí la semántica ya deja de serlo porque la semántica reside en lo profundo.

La única forma de capturar la semántica es definir o establecer un conjunto de conceptos genéricos (o universales) y definir una sintaxis, no para los conceptos (que son irrepresentables), sino para las expresiones particulares (o manifestaciones) de esos conceptos.


El lenguaje universal y el paradigma universal

La evolución de la informática está pues gravemente comprometida por la ausencia de un lenguaje estándar universal y un paradigma universal. Esta falta de estandarización tiene dos aspectos:
  1. Semántico.
    No existe un conjunto mínimo de conceptos comúnmente aceptados, ortogonales (independientes entre sí), y que no dependan de la implementación, de ninguna arquitectura de máquina. Por todo ello, la semántica formal no ha llegado al gran público. “Lo que se necesita es una semántica popular” [Schmidt, 1997].

  2. Sintáctico.
    Falta una notación canónica plenamente aceptada que sea además reflejo de la semántica.
Este lenguaje estándar debería cubrir también los aspectos operativo y descriptivo. El objetivo final sería lograr un estándar que permita una perfecta portabilidad de código (de datos y procesos).

La complejidad y la dificultad en la definición de un lenguaje estándar universal parece provenir precisamente de la adopción de enfoques particulares y en la no utilización de recursos semánticos de “muy alto nivel”. Sólo un enfoque genérico puede ayudar a integrar los diferentes paradigmas y reducir esta complejidad, que sólo es aparente, pues en la raíz de todos los paradigmas deben ocultarse conceptos simples y universales.

Lo que necesitamos ahora es un cambio cultural, más que tecnológico, cambio que tiene que ser forzosamente de tipo unificador. Debemos seguir la recomendación de Winograd y repensar desde el principio el tema de la programación de ordenadores. Necesitamos un paradigma unificador basado en conceptos de muy alto nivel que nos permita reconocer la raíz de todos los lenguajes y de todos los paradigmas, para así poder definir un lenguaje formal universal, que debería ser el fundamento de la web semántica.


Informática vs. Matemática

La unificación

Hasta ahora informática y matemática han sido disciplinas distintas. Es ya la hora de tratar de unificar ambas disciplinas a través de unos mecanismos conceptuales suficientemente genéricos e intuitivos. La semántica formal debería constituir la fundamentación común de la matemática y la informática.

Una cierta integración ya está teniendo lugar en diferentes frentes: Conceptos nuevos y mecanismos de expresión muy poderosos, utilizados por los lenguajes de programación, pueden enriquecer la matemática. Por ejemplo: En definitiva, el objetivo último que se debe perseguir es la unificación de ambas disciplinas, y conseguir que la nueva notación matemática sea “ejecutable”, comprensible por los ordenadores. Un intento en este sentido es el del lenguaje J [Iverson, 1995].


Aportaciones de la informática a la matemática

Desde la aparición de la informática, la matemática ya no la vemos igual porque la informática ha fertilizado a la matemática, proporcionándola una nueva visión, un nuevo paradigma, una nueva forma de contemplarla que ha ayudado a clarificarla, a comprenderla mejor.

La informática es una ciencia relativamente reciente, que nació gracias a la matemática, pero que ha influido, y está influyendo, en la propia matemática, enriqueciéndola. Este proceso de realimentación es una especie de “devolución del favor prestado”, que se está realizando de diversas formas:
La matemática experimental

La matemática experimental es un tipo de investigación matemática que utiliza la computación y la representación gráfica para hacer la matemática más tangible y visible, tanto para el matemático profesional como para el aficionado. Este tipo de hacer matemática siempre ha sido practicada por los matemáticos, aunque ha emergido con fuerza desde la invención del ordenador. El ordenador se ha convertido en una herramienta imprescindible para la investigación científica, como el telescopio es para el astrónomo.

“La matemática no es una ciencia deductiva eso es un cliché. Cuando tratamos de demostrar un teorema, no establecemos las hipótesis y luego comenzamos a razonar. Lo que hacemos es prueba y error, experimentación, conjeturas. Queremos descubrir lo que son los hechos, y lo que hacemos a ese respecto es similar a lo que hace un técnico de laboratorio” [Halmos, 1985].

Entre las actividades y propósitos de la matemática experimental están: En este último tema, el ejemplo más paradigmático es el famoso “teorema de los cuatro colores” (4 colores son suficientes para colorear un mapa), demostrado con la ayuda de un ordenador en 1976 por Kenneth Appel y Wolfgang Haken. Este teorema necesita para verificarse un ordenador. Ron Graham (un matemático de los Laboratorios Bell) se preguntaba: “Si ningún humano puede verificar la demostración, ¿se trata verdaderamente de una demostración?”.

No conocemos el código fuente del programa ni el lenguaje con el que fue escrito. Disponer de un lenguaje estandar, canónico y universal común a humanos y ordenadores sería de una gran ayuda, pues todo el mundo podría juzgar y comprobar si se trata de una verdadera demostración.

Algunos ejemplos de logros de la matemática experimental con la ayuda de ordenador son: La informática no solo ha fertilizado a la matemática. También lo ha hecho con otras ciencias susceptibles de una cierta formalización. También de ella han derivado nuevas disciplinas, como la inteligencia artificial, la vida artificial y la ciencia de la web (Web Science).



Bibliografía